Programming CDISC ADaM ADNCA using R and {admiral}

Jeff Dickinson, Navitas Data Sciences

Agenda

  • Basic Concepts of Non-Compartmental Analysis NCA
  • Quick overview of {admiral}
  • Coding Steps for ADNCA
  • New Functionality Highlights
  • Conclusions
  • Questions and Answers

Overview of CDISC Non-Compartmental Analysis

https://www.cdisc.org/standards/foundational/adam/adamig-non-compartmental-analysis-input-data-v1-0

Pharmacokinetic Analysis

Example PK Curve with Parameters

Important Components of ADNCA datasets

  • Inclusion of Both PK Concentration records PC and Dosing Records EX
  • Timing Variables
  • Duplicated Records for Analysis
  • Exclusion Flags

Time Variables

Variable Variable Label
NFRLT Nom. Rel. Time from Analyte First Dose
AFRLT Act. Rel. Time from Analyte First Dose
NRRLT Nominal Rel. Time from Ref. Dose
ARRLT Actual Rel. Time from Ref. Dose
MRRLT Modified Rel. Time from Ref. Dose

Brief Overview of {admiral}

https://github.com/pharmaverse/admiral

{admiral}

  • ADaM in R Asset Library
  • {admiral} is Open Source and Collaborative
  • {admiral} is Modular
  • {admiral} is Part of Pharmaverse

{admiral} is part of Pharmaverse

https://github.com/pharmaverse

Programming Workflow

Programming Workflow (Continued)

{admiral} Libraries

library(admiral)
library(admiraldev)
library(dplyr)
library(admiral.test)
library(lubridate)
library(stringr)

Read in Data

data("admiral_adsl")
data("admiral_ex")
data("admiral_pc")
data("admiral_vs")

adsl <- admiral_adsl
ex <- convert_blanks_to_na(admiral_ex)
pc <- convert_blanks_to_na(admiral_pc)
vs <- convert_blanks_to_na(admiral_vs)

PC Rawdata

# A tibble: 14 × 6
   USUBJID     PCTEST     PCDTC               VISIT    PCTPT            PCSTRESN
   <chr>       <chr>      <chr>               <chr>    <chr>               <dbl>
 1 01-701-1028 XANOMELINE 2013-07-18T23:30:00 BASELINE Pre-dose           0     
 2 01-701-1028 XANOMELINE 2013-07-19T00:05:00 BASELINE 5 Min Post-dose    0.0957
 3 01-701-1028 XANOMELINE 2013-07-19T00:30:00 BASELINE 30 Min Post-dose   0.522 
 4 01-701-1028 XANOMELINE 2013-07-19T01:00:00 BASELINE 1h Post-dose       0.895 
 5 01-701-1028 XANOMELINE 2013-07-19T01:30:00 BASELINE 1.5h Post-dose     1.16  
 6 01-701-1028 XANOMELINE 2013-07-19T02:00:00 BASELINE 2h Post-dose       1.35  
 7 01-701-1028 XANOMELINE 2013-07-19T04:00:00 BASELINE 4h Post-dose       1.71  
 8 01-701-1028 XANOMELINE 2013-07-19T06:00:00 BASELINE 6h Post-dose       1.80  
 9 01-701-1028 XANOMELINE 2013-07-19T08:00:00 BASELINE 8h Post-dose       1.82  
10 01-701-1028 XANOMELINE 2013-07-19T12:00:00 BASELINE 12h Post-dose      0.571 
11 01-701-1028 XANOMELINE 2013-07-19T16:00:00 BASELINE 16h Post-dose      0.178 
12 01-701-1028 XANOMELINE 2013-07-20T00:00:00 BASELINE 24h Post-dose      0.0173
13 01-701-1028 XANOMELINE 2013-07-20T12:00:00 BASELINE 36h Post-dose     NA     
14 01-701-1028 XANOMELINE 2013-07-21T00:00:00 BASELINE 48h Post-dose     NA     

Join ADSL with PC

  • Use function derive_vars_merged()
  • Convert Dates to Numeric
  • Functions
    • derive_vars_dtm()

    • derive_vars_dtm_to_dt()

    • derive_vars_dtm_to_tm()

    • derive_vars_dy()

  • Derive NFRLT for PC data based on PCTPTNUM

PC Merge Code

adsl_vars <- exprs(TRTSDT, TRTSDTM, TRT01P, TRT01A)

adpc <- pc %>%
  # Join ADSL with PC (need TRTSDT for ADY derivation)
  derive_vars_merged(
    dataset_add = adsl,
    new_vars = adsl_vars,
    by_vars = exprs(STUDYID, USUBJID)
  ) %>%
  # Calculate ADTM, ADT, ADY
  derive_vars_dtm(
    new_vars_prefix = "A",
    dtc = PCDTC,
    time_imputation = "00:00:00"
  ) %>%
  # Derive dates and times from date/times
  derive_vars_dtm_to_dt(exprs(ADTM)) %>%
  derive_vars_dtm_to_tm(exprs(ADTM)) %>%
  derive_vars_dy(reference_date = TRTSDT, source_vars = exprs(ADT)) %>%
  # Derive event ID and nominal relative time from first dose (NFRLT)
  mutate(
    EVID = 0,
    DRUG = PCTEST,
    NFRLT = if_else(PCTPTNUM < 0, 0, PCTPTNUM), .after = USUBJID
  )

PC Merge Code Output

# A tibble: 14 × 6
   USUBJID     PCTEST     ADTM                VISIT    PCTPT            NFRLT
   <chr>       <chr>      <dttm>              <chr>    <chr>            <dbl>
 1 01-701-1028 XANOMELINE 2013-07-18 23:30:00 BASELINE Pre-dose          0   
 2 01-701-1028 XANOMELINE 2013-07-19 00:05:00 BASELINE 5 Min Post-dose   0.08
 3 01-701-1028 XANOMELINE 2013-07-19 00:30:00 BASELINE 30 Min Post-dose  0.5 
 4 01-701-1028 XANOMELINE 2013-07-19 01:00:00 BASELINE 1h Post-dose      1   
 5 01-701-1028 XANOMELINE 2013-07-19 01:30:00 BASELINE 1.5h Post-dose    1.5 
 6 01-701-1028 XANOMELINE 2013-07-19 02:00:00 BASELINE 2h Post-dose      2   
 7 01-701-1028 XANOMELINE 2013-07-19 04:00:00 BASELINE 4h Post-dose      4   
 8 01-701-1028 XANOMELINE 2013-07-19 06:00:00 BASELINE 6h Post-dose      6   
 9 01-701-1028 XANOMELINE 2013-07-19 08:00:00 BASELINE 8h Post-dose      8   
10 01-701-1028 XANOMELINE 2013-07-19 12:00:00 BASELINE 12h Post-dose    12   
11 01-701-1028 XANOMELINE 2013-07-19 16:00:00 BASELINE 16h Post-dose    16   
12 01-701-1028 XANOMELINE 2013-07-20 00:00:00 BASELINE 24h Post-dose    24   
13 01-701-1028 XANOMELINE 2013-07-20 12:00:00 BASELINE 36h Post-dose    36   
14 01-701-1028 XANOMELINE 2013-07-21 00:00:00 BASELINE 48h Post-dose    48   

EX Rawdata

# A tibble: 3 × 7
  USUBJID     EXTRT      EXDOSFRQ EXSTDTC    EXENDTC    VISIT    VISITDY
  <chr>       <chr>      <chr>    <chr>      <chr>      <chr>      <dbl>
1 01-701-1028 XANOMELINE QD       2013-07-19 2013-08-01 BASELINE       1
2 01-701-1028 XANOMELINE QD       2013-08-02 2014-01-06 WEEK 2        14
3 01-701-1028 XANOMELINE QD       2014-01-07 2014-01-14 WEEK 24      168

Merge ADSL with EX

  • Use Function derive_vars_merged()
  • Keep Only Non-Zero Dose
  • Convert Dates to Numeric
  • Impute missing times to 0:00*
  • Functions
    • derive_vars_dtm()

    • derive_vars_dtm_to_dt()

  • Derive NFRLT based on VISITDY

EX Merge Code

# ---- Get dosing information ----

ex <- ex %>%
  derive_vars_merged(
    dataset_add = adsl,
    new_vars = adsl_vars,
    by_vars = exprs(STUDYID, USUBJID)
  ) %>%
  # Keep records with nonzero dose
  filter(EXDOSE > 0) %>%
  # Add time and set missing end date to start date
  # Impute missing time to 00:00:00
  # Derive Analysis Start and End Dates
  derive_vars_dtm(
    new_vars_prefix = "AST",
    dtc = EXSTDTC,
    time_imputation = "00:00:00"
  ) %>%
  derive_vars_dtm(
    new_vars_prefix = "AEN",
    dtc = EXENDTC,
    time_imputation = "00:00:00"
  ) %>%
  # Derive event ID and nominal relative time from first dose (NFRLT)
  mutate(
    EVID = 1,
    NFRLT = 24 * (VISITDY - 1), .after = USUBJID
  ) %>%
  # Set missing end dates to start date
  mutate(AENDTM = case_when(
    is.na(AENDTM) ~ ASTDTM,
    TRUE ~ AENDTM
  )) %>%
  # Derive dates from date/times
  derive_vars_dtm_to_dt(exprs(ASTDTM)) %>%
  derive_vars_dtm_to_dt(exprs(AENDTM))

EX Merge Output

# A tibble: 3 × 7
  USUBJID     EXTRT      EXDOSFRQ ASTDT      AENDT      VISITDY NFRLT
  <chr>       <chr>      <chr>    <date>     <date>       <dbl> <dbl>
1 01-701-1028 XANOMELINE QD       2013-07-19 2013-08-01       1     0
2 01-701-1028 XANOMELINE QD       2013-08-02 2014-01-06      14   312
3 01-701-1028 XANOMELINE QD       2014-01-07 2014-01-14     168  4008

Expand Dosing Records

  • Need to add records between start date and end date
  • Use function create_single_dose_dataset()
  • Need to also expand nominal relative time NFRLT
  • For example EXDOSFRQ = “QD” will expand NFRLT by 24 hours
  • New feature of function

Expansion Example Code

# ---- Expand dosing records between start and end dates ----

ex_exp <- ex %>%
  create_single_dose_dataset(
    dose_freq = EXDOSFRQ,
    start_date = ASTDT,
    start_datetime = ASTDTM,
    end_date = AENDT,
    end_datetime = AENDTM,
    nominal_time = NFRLT,
    lookup_table = dose_freq_lookup,
    lookup_column = CDISC_VALUE,
    keep_source_vars = exprs(
      STUDYID, USUBJID, EVID, EXDOSFRQ, EXDOSFRM,
      NFRLT, EXDOSE, EXTRT, ASTDT, ASTDTM, AENDT, AENDTM,
      VISIT, VISITNUM, VISITDY,
      TRT01A, TRT01P, DOMAIN, EXSEQ, !!!adsl_vars
    )
  ) %>%
  # Derive AVISIT based on nominal relative time
  mutate(
    AVISITN = NFRLT %/% 24 + 1,
    AVISIT = paste("Day", AVISITN),
    ADTM = ASTDTM,
    DRUG = EXTRT,
  ) %>%
  # Derive dates and times from datetimes
  derive_vars_dtm_to_dt(exprs(ADTM)) %>%
  derive_vars_dtm_to_tm(exprs(ADTM)) %>%
  derive_vars_dtm_to_tm(exprs(ASTDTM)) %>%
  derive_vars_dtm_to_tm(exprs(AENDTM)) %>%
  derive_vars_dy(reference_date = TRTSDT, source_vars = exprs(ADT))

Expansion Code Output

# A tibble: 20 × 7
   USUBJID    DRUG  EXDOS…¹ ASTDTM              AENDTM              AVISIT NFRLT
   <chr>      <chr> <chr>   <dttm>              <dttm>              <chr>  <dbl>
 1 01-701-10… XANO… ONCE    2013-07-19 00:00:00 2013-07-19 00:00:00 Day 1      0
 2 01-701-10… XANO… ONCE    2013-07-20 00:00:00 2013-07-20 00:00:00 Day 2     24
 3 01-701-10… XANO… ONCE    2013-07-21 00:00:00 2013-07-21 00:00:00 Day 3     48
 4 01-701-10… XANO… ONCE    2013-07-22 00:00:00 2013-07-22 00:00:00 Day 4     72
 5 01-701-10… XANO… ONCE    2013-07-23 00:00:00 2013-07-23 00:00:00 Day 5     96
 6 01-701-10… XANO… ONCE    2013-07-24 00:00:00 2013-07-24 00:00:00 Day 6    120
 7 01-701-10… XANO… ONCE    2013-07-25 00:00:00 2013-07-25 00:00:00 Day 7    144
 8 01-701-10… XANO… ONCE    2013-07-26 00:00:00 2013-07-26 00:00:00 Day 8    168
 9 01-701-10… XANO… ONCE    2013-07-27 00:00:00 2013-07-27 00:00:00 Day 9    192
10 01-701-10… XANO… ONCE    2013-07-28 00:00:00 2013-07-28 00:00:00 Day 10   216
11 01-701-10… XANO… ONCE    2013-07-29 00:00:00 2013-07-29 00:00:00 Day 11   240
12 01-701-10… XANO… ONCE    2013-07-30 00:00:00 2013-07-30 00:00:00 Day 12   264
13 01-701-10… XANO… ONCE    2013-07-31 00:00:00 2013-07-31 00:00:00 Day 13   288
14 01-701-10… XANO… ONCE    2013-08-01 00:00:00 2013-08-01 00:00:00 Day 14   312
15 01-701-10… XANO… ONCE    2013-08-02 00:00:00 2013-08-02 00:00:00 Day 14   312
16 01-701-10… XANO… ONCE    2013-08-03 00:00:00 2013-08-03 00:00:00 Day 15   336
17 01-701-10… XANO… ONCE    2013-08-04 00:00:00 2013-08-04 00:00:00 Day 16   360
18 01-701-10… XANO… ONCE    2013-08-05 00:00:00 2013-08-05 00:00:00 Day 17   384
19 01-701-10… XANO… ONCE    2013-08-06 00:00:00 2013-08-06 00:00:00 Day 18   408
20 01-701-10… XANO… ONCE    2013-08-07 00:00:00 2013-08-07 00:00:00 Day 19   432
# … with abbreviated variable name ¹​EXDOSFRQ

Find First Dose and Calculate FANLDTM

  • Use Function derive_vars_merged()
  • Parameter new_vars used to derive FANLDTM
  • Recalculate AVISIT and AVISITN based on NFRLT for this study

First Dose Code

# ---- Find first dose per treatment per subject ----
# ---- Join with ADPC data and keep only subjects with dosing ----

adpc <- adpc %>%
  derive_vars_merged(
    dataset_add = ex_exp,
    filter_add = (EXDOSE > 0 & !is.na(ADTM)),
    new_vars = exprs(FANLDTM = ADTM),
    order = exprs(ADTM, EXSEQ),
    mode = "first",
    by_vars = exprs(STUDYID, USUBJID, DRUG)
  ) %>%
  filter(!is.na(FANLDTM)) %>%
  # Derive AVISIT from nominal relative time
  mutate(
    AVISITN = NFRLT %/% 24 + 1,
    AVISIT = paste("Day", AVISITN),
  )

First Dose Output

# A tibble: 14 × 5
   USUBJID     FANLDTM             AVISIT ADTM                PCTPT           
   <chr>       <dttm>              <chr>  <dttm>              <chr>           
 1 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-18 23:30:00 Pre-dose        
 2 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 00:05:00 5 Min Post-dose 
 3 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 00:30:00 30 Min Post-dose
 4 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 01:00:00 1h Post-dose    
 5 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 01:30:00 1.5h Post-dose  
 6 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 02:00:00 2h Post-dose    
 7 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 04:00:00 4h Post-dose    
 8 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 06:00:00 6h Post-dose    
 9 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 08:00:00 8h Post-dose    
10 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 12:00:00 12h Post-dose   
11 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 16:00:00 16h Post-dose   
12 01-701-1028 2013-07-19 00:00:00 Day 2  2013-07-20 00:00:00 24h Post-dose   
13 01-701-1028 2013-07-19 00:00:00 Day 2  2013-07-20 12:00:00 36h Post-dose   
14 01-701-1028 2013-07-19 00:00:00 Day 3  2013-07-21 00:00:00 48h Post-dose   

Find Reference Dose Dates Corresponding to PK Records

  • Use Function derive_vars_joined()
  • Parameter filter_join used to set condition

Find Reference Dose Dates Code

# ---- Find previous dose  ----
# Use derive_vars_joined() for consistency with other variables
# This is equivalent to derive_vars_last_dose() in this case

adpc <- adpc %>%
  derive_vars_joined(
    dataset_add = ex_exp,
    by_vars = exprs(USUBJID),
    order = exprs(ADTM),
    new_vars = exprs(
      ADTM_prev = ADTM, EXDOSE_prev = EXDOSE, AVISIT_prev = AVISIT,
      AENDTM_prev = AENDTM
    ),
    join_vars = exprs(ADTM),
    filter_add = NULL,
    filter_join = ADTM > ADTM.join,
    mode = "last",
    check_type = "none"
  )

Find Reference Dose Dates Output

# A tibble: 14 × 7
   USUBJID   VISIT ADTM                PCTPT ADTM_prev           EXDOS…¹ AVISI…²
   <chr>     <chr> <dttm>              <chr> <dttm>                <dbl> <chr>  
 1 01-701-1… BASE… 2013-07-18 23:30:00 Pre-… NA                       NA <NA>   
 2 01-701-1… BASE… 2013-07-19 00:05:00 5 Mi… 2013-07-19 00:00:00      54 Day 1  
 3 01-701-1… BASE… 2013-07-19 00:30:00 30 M… 2013-07-19 00:00:00      54 Day 1  
 4 01-701-1… BASE… 2013-07-19 01:00:00 1h P… 2013-07-19 00:00:00      54 Day 1  
 5 01-701-1… BASE… 2013-07-19 01:30:00 1.5h… 2013-07-19 00:00:00      54 Day 1  
 6 01-701-1… BASE… 2013-07-19 02:00:00 2h P… 2013-07-19 00:00:00      54 Day 1  
 7 01-701-1… BASE… 2013-07-19 04:00:00 4h P… 2013-07-19 00:00:00      54 Day 1  
 8 01-701-1… BASE… 2013-07-19 06:00:00 6h P… 2013-07-19 00:00:00      54 Day 1  
 9 01-701-1… BASE… 2013-07-19 08:00:00 8h P… 2013-07-19 00:00:00      54 Day 1  
10 01-701-1… BASE… 2013-07-19 12:00:00 12h … 2013-07-19 00:00:00      54 Day 1  
11 01-701-1… BASE… 2013-07-19 16:00:00 16h … 2013-07-19 00:00:00      54 Day 1  
12 01-701-1… BASE… 2013-07-20 00:00:00 24h … 2013-07-19 00:00:00      54 Day 1  
13 01-701-1… BASE… 2013-07-20 12:00:00 36h … 2013-07-20 00:00:00      54 Day 2  
14 01-701-1… BASE… 2013-07-21 00:00:00 48h … 2013-07-20 00:00:00      54 Day 2  
# … with abbreviated variable names ¹​EXDOSE_prev, ²​AVISIT_prev

Find Next Dose

# ---- Find next dose  ----

adpc <- adpc %>%
  derive_vars_joined(
    dataset_add = ex_exp,
    by_vars = exprs(USUBJID),
    order = exprs(ADTM),
    new_vars = exprs(
      ADTM_next = ADTM, EXDOSE_next = EXDOSE, AVISIT_next = AVISIT,
      AENDTM_next = AENDTM
    ),
    join_vars = exprs(ADTM),
    filter_add = NULL,
    filter_join = ADTM <= ADTM.join,
    mode = "first",
    check_type = "none"
  )

Find Next Dose Output

# A tibble: 14 × 7
   USUBJID   VISIT ADTM                PCTPT ADTM_next           EXDOS…¹ AVISI…²
   <chr>     <chr> <dttm>              <chr> <dttm>                <dbl> <chr>  
 1 01-701-1… BASE… 2013-07-18 23:30:00 Pre-… 2013-07-19 00:00:00      54 Day 1  
 2 01-701-1… BASE… 2013-07-19 00:05:00 5 Mi… 2013-07-20 00:00:00      54 Day 2  
 3 01-701-1… BASE… 2013-07-19 00:30:00 30 M… 2013-07-20 00:00:00      54 Day 2  
 4 01-701-1… BASE… 2013-07-19 01:00:00 1h P… 2013-07-20 00:00:00      54 Day 2  
 5 01-701-1… BASE… 2013-07-19 01:30:00 1.5h… 2013-07-20 00:00:00      54 Day 2  
 6 01-701-1… BASE… 2013-07-19 02:00:00 2h P… 2013-07-20 00:00:00      54 Day 2  
 7 01-701-1… BASE… 2013-07-19 04:00:00 4h P… 2013-07-20 00:00:00      54 Day 2  
 8 01-701-1… BASE… 2013-07-19 06:00:00 6h P… 2013-07-20 00:00:00      54 Day 2  
 9 01-701-1… BASE… 2013-07-19 08:00:00 8h P… 2013-07-20 00:00:00      54 Day 2  
10 01-701-1… BASE… 2013-07-19 12:00:00 12h … 2013-07-20 00:00:00      54 Day 2  
11 01-701-1… BASE… 2013-07-19 16:00:00 16h … 2013-07-20 00:00:00      54 Day 2  
12 01-701-1… BASE… 2013-07-20 00:00:00 24h … 2013-07-20 00:00:00      54 Day 2  
13 01-701-1… BASE… 2013-07-20 12:00:00 36h … 2013-07-21 00:00:00      54 Day 3  
14 01-701-1… BASE… 2013-07-21 00:00:00 48h … 2013-07-21 00:00:00      54 Day 3  
# … with abbreviated variable names ¹​EXDOSE_next, ²​AVISIT_next

Find Previous Nominal Dose

# ---- Find previous nominal time ----

adpc <- adpc %>%
  derive_vars_joined(
    dataset_add = ex_exp,
    by_vars = exprs(USUBJID),
    order = exprs(NFRLT),
    new_vars = exprs(NFRLT_prev = NFRLT),
    join_vars = exprs(NFRLT),
    filter_add = NULL,
    filter_join = NFRLT > NFRLT.join,
    mode = "last",
    check_type = "none"
  )

Find Next Nominal Dose

# ---- Find next nominal time ----

adpc <- adpc %>%
  derive_vars_joined(
    dataset_add = ex_exp,
    by_vars = exprs(USUBJID),
    order = exprs(NFRLT),
    new_vars = exprs(NFRLT_next = NFRLT),
    join_vars = exprs(NFRLT),
    filter_add = NULL,
    filter_join = NFRLT <= NFRLT.join,
    mode = "first",
    check_type = "none"
  )

Find Next Nominal Dose Output

# A tibble: 14 × 5
   USUBJID     NFRLT PCTPT            NFRLT_prev NFRLT_next
   <chr>       <dbl> <chr>                 <dbl>      <dbl>
 1 01-701-1028  0    Pre-dose                 NA          0
 2 01-701-1028  0.08 5 Min Post-dose           0         24
 3 01-701-1028  0.5  30 Min Post-dose          0         24
 4 01-701-1028  1    1h Post-dose              0         24
 5 01-701-1028  1.5  1.5h Post-dose            0         24
 6 01-701-1028  2    2h Post-dose              0         24
 7 01-701-1028  4    4h Post-dose              0         24
 8 01-701-1028  6    6h Post-dose              0         24
 9 01-701-1028  8    8h Post-dose              0         24
10 01-701-1028 12    12h Post-dose             0         24
11 01-701-1028 16    16h Post-dose             0         24
12 01-701-1028 24    24h Post-dose             0         24
13 01-701-1028 36    36h Post-dose            24         48
14 01-701-1028 48    48h Post-dose            24         48

Combine PC and EX Records and Derive Relative Time Variables

  • Include both dosing and concentration records
  • Use function derive_vars_duration()
  • Create Actual Relative Time AFRLT

Combine PC and EX Records and Derive Relative Time Variables Code

# ---- Combine ADPC and EX data ----
# Derive Relative Time Variables


adpc <- bind_rows(adpc, ex_exp) %>%
  group_by(USUBJID, DRUG) %>%
  mutate(
    FANLDTM = min(FANLDTM, na.rm = TRUE),
    min_NFRLT = min(NFRLT_prev, na.rm = TRUE),
    maxdate = max(ADT[EVID == 0], na.rm = TRUE), .after = USUBJID
  ) %>%
  arrange(USUBJID, ADTM) %>%
  ungroup() %>%
  filter(ADT <= maxdate) %>%
  # Derive Actual Relative Time from First Dose (AFRLT)
  derive_vars_duration(
    new_var = AFRLT,
    start_date = FANLDTM,
    end_date = ADTM,
    out_unit = "hours",
    floor_in = FALSE,
    add_one = FALSE
  ) %>%
  # Derive Actual Relative Time from Reference Dose (ARRLT)
  derive_vars_duration(
    new_var = ARRLT,
    start_date = ADTM_prev,
    end_date = ADTM,
    out_unit = "hours",
    floor_in = FALSE,
    add_one = FALSE
  ) %>%
  # Derive Actual Relative Time from Next Dose (AXRLT not kept)
  derive_vars_duration(
    new_var = AXRLT,
    start_date = ADTM_next,
    end_date = ADTM,
    out_unit = "hours",
    floor_in = FALSE,
    add_one = FALSE
  ) %>%
  mutate(
    ARRLT = case_when(
      EVID == 1 ~ 0,
      is.na(ARRLT) ~ AXRLT,
      TRUE ~ ARRLT
    ),

    # Derive Reference Dose Date
    PCRFTDTM = case_when(
      EVID == 1 ~ ADTM,
      is.na(ADTM_prev) ~ ADTM_next,
      TRUE ~ ADTM_prev
    )
  ) %>%
  # Derive dates and times from datetimes
  derive_vars_dtm_to_dt(exprs(FANLDTM)) %>%
  derive_vars_dtm_to_tm(exprs(FANLDTM)) %>%
  derive_vars_dtm_to_dt(exprs(PCRFTDTM)) %>%
  derive_vars_dtm_to_tm(exprs(PCRFTDTM))

Derive Relative Time Output

# A tibble: 17 × 7
   USUBJID     FANLDTM             AVISIT PCTPT              AFRLT   ARRLT AXRLT
   <chr>       <dttm>              <chr>  <chr>              <dbl>   <dbl> <dbl>
 1 01-701-1028 2013-07-19 00:00:00 Day 1  Pre-dose         -0.5    -0.5     -0.5
 2 01-701-1028 2013-07-19 00:00:00 Day 1  <NA>              0       0       NA  
 3 01-701-1028 2013-07-19 00:00:00 Day 1  5 Min Post-dose   0.0833  0.0833 -23.9
 4 01-701-1028 2013-07-19 00:00:00 Day 1  30 Min Post-dose  0.5     0.5    -23.5
 5 01-701-1028 2013-07-19 00:00:00 Day 1  1h Post-dose      1       1      -23  
 6 01-701-1028 2013-07-19 00:00:00 Day 1  1.5h Post-dose    1.5     1.5    -22.5
 7 01-701-1028 2013-07-19 00:00:00 Day 1  2h Post-dose      2       2      -22  
 8 01-701-1028 2013-07-19 00:00:00 Day 1  4h Post-dose      4       4      -20  
 9 01-701-1028 2013-07-19 00:00:00 Day 1  6h Post-dose      6       6      -18  
10 01-701-1028 2013-07-19 00:00:00 Day 1  8h Post-dose      8       8      -16  
11 01-701-1028 2013-07-19 00:00:00 Day 1  12h Post-dose    12      12      -12  
12 01-701-1028 2013-07-19 00:00:00 Day 1  16h Post-dose    16      16       -8  
13 01-701-1028 2013-07-19 00:00:00 Day 2  24h Post-dose    24      24        0  
14 01-701-1028 2013-07-19 00:00:00 Day 2  <NA>             24       0       NA  
15 01-701-1028 2013-07-19 00:00:00 Day 2  36h Post-dose    36      12      -12  
16 01-701-1028 2013-07-19 00:00:00 Day 3  48h Post-dose    48      24        0  
17 01-701-1028 2013-07-19 00:00:00 Day 3  <NA>             48       0       NA  

Find Nominal Relative Times

adpc <- adpc %>%
  # Derive Nominal Relative Time from Reference Dose (NRRLT)
  mutate(
    NRRLT = case_when(
      EVID == 1 ~ 0,
      is.na(NFRLT_prev) ~ NFRLT - min_NFRLT,
      TRUE ~ NFRLT - NFRLT_prev
    ),
    NXRLT = case_when(
      EVID == 1 ~ 0,
      TRUE ~ NFRLT - NFRLT_next
    )
  )

Nominal Relative Times Output

# A tibble: 17 × 6
   USUBJID     AVISIT PCTPT            NFRLT NRRLT NXRLT
   <chr>       <chr>  <chr>            <dbl> <dbl> <dbl>
 1 01-701-1028 Day 1  Pre-dose          0     0      0  
 2 01-701-1028 Day 1  <NA>              0     0      0  
 3 01-701-1028 Day 1  5 Min Post-dose   0.08  0.08 -23.9
 4 01-701-1028 Day 1  30 Min Post-dose  0.5   0.5  -23.5
 5 01-701-1028 Day 1  1h Post-dose      1     1    -23  
 6 01-701-1028 Day 1  1.5h Post-dose    1.5   1.5  -22.5
 7 01-701-1028 Day 1  2h Post-dose      2     2    -22  
 8 01-701-1028 Day 1  4h Post-dose      4     4    -20  
 9 01-701-1028 Day 1  6h Post-dose      6     6    -18  
10 01-701-1028 Day 1  8h Post-dose      8     8    -16  
11 01-701-1028 Day 1  12h Post-dose    12    12    -12  
12 01-701-1028 Day 1  16h Post-dose    16    16     -8  
13 01-701-1028 Day 2  24h Post-dose    24    24      0  
14 01-701-1028 Day 2  <NA>             24     0      0  
15 01-701-1028 Day 2  36h Post-dose    36    12    -12  
16 01-701-1028 Day 3  48h Post-dose    48    24      0  
17 01-701-1028 Day 3  <NA>             48     0      0  

Derive Analysis Variables

adpc <- adpc %>%
  mutate(
    ATPTN = case_when(
      EVID == 1 ~ 0,
      TRUE ~ PCTPTNUM
    ),
    ATPT = case_when(
      EVID == 1 ~ "Dose",
      TRUE ~ PCTPT
    ),
    ATPTREF = case_when(
      EVID == 1 ~ AVISIT,
      is.na(AVISIT_prev) ~ AVISIT_next,
      TRUE ~ AVISIT_prev
    ),
    # Derive baseline flag for pre-dose records
    ABLFL = case_when(
      ATPT == "Pre-dose" ~ "Y",
      TRUE ~ NA_character_
    ),
    # Derive BASETYPE
    BASETYPE = paste(ATPTREF, "Baseline"),

    # Derive Actual Dose
    DOSEA = case_when(
      EVID == 1 ~ EXDOSE,
      is.na(EXDOSE_prev) ~ EXDOSE_next,
      TRUE ~ EXDOSE_next
    ),
    # Derive Planned Dose
    DOSEP = case_when(
      TRT01P == "Xanomeline High Dose" ~ 81,
      TRT01P == "Xanomeline Low Dose" ~ 54
    ),
    DOSEU = "mg",
  ) %>%
  mutate(
    RFLTU = "h",
    RRLTU = "h",
    PARAMCD = coalesce(PCTESTCD, "DOSE"),
    ALLOQ = PCLLOQ,
    AVAL = case_when(
      EVID == 1 ~ EXDOSE,
      PCSTRESC == "<BLQ" & NFRLT == 0 ~ 0,
      PCSTRESC == "<BLQ" & NFRLT > 0 ~ 0.5 * ALLOQ,
      TRUE ~ PCSTRESN
    ),
    AVALC = case_when(
      EVID == 1 ~ paste(EXDOSE),
      TRUE ~ PCSTRESC
    ),
    AVALCAT1 = if_else(PCSTRESC == "<BLQ", PCSTRESC, prettyNum(signif(AVAL, digits = 3))),
  ) %>%
  # Add SRCSEQ
  mutate(
    SRCDOM = DOMAIN,
    SRCVAR = "SEQ",
    SRCSEQ = coalesce(PCSEQ, EXSEQ)
  )

Analysis Variable Output

# A tibble: 17 × 8
   USUBJID     NFRLT AVISIT ATPT             ABLFL ATPTREF    AVAL AVALCAT1
   <chr>       <dbl> <chr>  <chr>            <chr> <chr>     <dbl> <chr>   
 1 01-701-1028  0    Day 1  Pre-dose         Y     Day 1    0      <BLQ    
 2 01-701-1028  0    Day 1  Dose             <NA>  Day 1   54      <NA>    
 3 01-701-1028  0.08 Day 1  5 Min Post-dose  <NA>  Day 1    0.0957 0.0957  
 4 01-701-1028  0.5  Day 1  30 Min Post-dose <NA>  Day 1    0.522  0.522   
 5 01-701-1028  1    Day 1  1h Post-dose     <NA>  Day 1    0.895  0.895   
 6 01-701-1028  1.5  Day 1  1.5h Post-dose   <NA>  Day 1    1.16   1.16    
 7 01-701-1028  2    Day 1  2h Post-dose     <NA>  Day 1    1.35   1.35    
 8 01-701-1028  4    Day 1  4h Post-dose     <NA>  Day 1    1.71   1.71    
 9 01-701-1028  6    Day 1  6h Post-dose     <NA>  Day 1    1.80   1.8     
10 01-701-1028  8    Day 1  8h Post-dose     <NA>  Day 1    1.82   1.82    
11 01-701-1028 12    Day 1  12h Post-dose    <NA>  Day 1    0.571  0.571   
12 01-701-1028 16    Day 1  16h Post-dose    <NA>  Day 1    0.178  0.178   
13 01-701-1028 24    Day 2  24h Post-dose    <NA>  Day 1    0.0173 0.0173  
14 01-701-1028 24    Day 2  Dose             <NA>  Day 2   54      <NA>    
15 01-701-1028 36    Day 2  36h Post-dose    <NA>  Day 2    0.005  <BLQ    
16 01-701-1028 48    Day 3  48h Post-dose    <NA>  Day 2    0.005  <BLQ    
17 01-701-1028 48    Day 3  Dose             <NA>  Day 3   54      <NA>    

Create Duplicated Records for Analysis

  • Create DTYPE = “COPY” Records
  • Original PCSEQ is retained
  • Change “24h Post-dose” to “Pre-dose”
  • ABLFL is set to “Y”

Duplicated Records for Analysis Code

# ---- Create DTYPE copy records ----

dtype <- adpc %>%
  filter(NFRLT > 0 & NXRLT == 0 & EVID == 0 & !is.na(AVISIT_next)) %>%
  select(-PCRFTDT, -PCRFTTM) %>%
  # Re-derive variables in for DTYPE copy records
  mutate(
    ABLFL = NA_character_,
    ATPTREF = AVISIT_next,
    ARRLT = AXRLT,
    NRRLT = NXRLT,
    PCRFTDTM = ADTM_next,
    DOSEA = EXDOSE_next,
    BASETYPE = paste(AVISIT_next, "Baseline"),
    ATPT = "Pre-dose",
    ATPTN = NFRLT,
    ABLFL = "Y",
    DTYPE = "COPY"
  ) %>%
  derive_vars_dtm_to_dt(exprs(PCRFTDTM)) %>%
  derive_vars_dtm_to_tm(exprs(PCRFTDTM))

Duplicated Records for Analysis Output

# A tibble: 2 × 8
  USUBJID     DTYPE ATPT     NFRLT NRRLT AFRLT ARRLT BASETYPE      
  <chr>       <chr> <chr>    <dbl> <dbl> <dbl> <dbl> <chr>         
1 01-701-1028 COPY  Pre-dose    24     0    24     0 Day 2 Baseline
2 01-701-1028 COPY  Pre-dose    48     0    48     0 Day 3 Baseline

Combine ADPC data with Duplicated Records

# ---- Combine original records and DTYPE copy records ----

adpc <- bind_rows(adpc, dtype) %>%
  arrange(STUDYID, USUBJID, BASETYPE, ADTM, NFRLT) %>%
  mutate(
    # Derive MRRLT, ANL01FL and ANL02FL
    MRRLT = if_else(ARRLT < 0, 0, ARRLT),
    ANL01FL = "Y",
    ANL02FL = if_else(is.na(DTYPE), "Y", NA_character_),
  )

Combine ADPC Output

# A tibble: 19 × 9
   STUDYID USUBJID BASET…¹ ADTM                ATPT  NFRLT NRRLT   ARRLT   MRRLT
   <chr>   <chr>   <chr>   <dttm>              <chr> <dbl> <dbl>   <dbl>   <dbl>
 1 CDISCP… 01-701… Day 1 … 2013-07-18 23:30:00 Pre-…  0     0    -0.5     0     
 2 CDISCP… 01-701… Day 1 … 2013-07-19 00:00:00 Dose   0     0     0       0     
 3 CDISCP… 01-701… Day 1 … 2013-07-19 00:05:00 5 Mi…  0.08  0.08  0.0833  0.0833
 4 CDISCP… 01-701… Day 1 … 2013-07-19 00:30:00 30 M…  0.5   0.5   0.5     0.5   
 5 CDISCP… 01-701… Day 1 … 2013-07-19 01:00:00 1h P…  1     1     1       1     
 6 CDISCP… 01-701… Day 1 … 2013-07-19 01:30:00 1.5h…  1.5   1.5   1.5     1.5   
 7 CDISCP… 01-701… Day 1 … 2013-07-19 02:00:00 2h P…  2     2     2       2     
 8 CDISCP… 01-701… Day 1 … 2013-07-19 04:00:00 4h P…  4     4     4       4     
 9 CDISCP… 01-701… Day 1 … 2013-07-19 06:00:00 6h P…  6     6     6       6     
10 CDISCP… 01-701… Day 1 … 2013-07-19 08:00:00 8h P…  8     8     8       8     
11 CDISCP… 01-701… Day 1 … 2013-07-19 12:00:00 12h … 12    12    12      12     
12 CDISCP… 01-701… Day 1 … 2013-07-19 16:00:00 16h … 16    16    16      16     
13 CDISCP… 01-701… Day 1 … 2013-07-20 00:00:00 24h … 24    24    24      24     
14 CDISCP… 01-701… Day 2 … 2013-07-20 00:00:00 Dose  24     0     0       0     
15 CDISCP… 01-701… Day 2 … 2013-07-20 00:00:00 Pre-… 24     0     0       0     
16 CDISCP… 01-701… Day 2 … 2013-07-20 12:00:00 36h … 36    12    12      12     
17 CDISCP… 01-701… Day 2 … 2013-07-21 00:00:00 48h … 48    24    24      24     
18 CDISCP… 01-701… Day 3 … 2013-07-21 00:00:00 Dose  48     0     0       0     
19 CDISCP… 01-701… Day 3 … 2013-07-21 00:00:00 Pre-… 48     0     0       0     
# … with abbreviated variable name ¹​BASETYPE

Calculate Change from Baseline

# ---- Calculate BASE and Change from Baseline ----

adpc <- adpc %>%
  # Derive BASE
  derive_var_base(
    by_vars = exprs(STUDYID, USUBJID, PARAMCD, BASETYPE),
    source_var = AVAL,
    new_var = BASE,
    filter = ABLFL == "Y"
  )

adpc <- derive_var_chg(adpc)

Baseline and Change Output

# A tibble: 19 × 12
   USUBJID     BASETYPE   DTYPE AVISIT ATPT     AVAL NFRLT NRRLT   AFRLT   ARRLT
   <chr>       <chr>      <chr> <chr>  <chr>   <dbl> <dbl> <dbl>   <dbl>   <dbl>
 1 01-701-1028 Day 1 Bas… <NA>  Day 1  Pre-…  0       0     0    -0.5    -0.5   
 2 01-701-1028 Day 1 Bas… <NA>  Day 1  Dose  54       0     0     0       0     
 3 01-701-1028 Day 1 Bas… <NA>  Day 1  5 Mi…  0.0957  0.08  0.08  0.0833  0.0833
 4 01-701-1028 Day 1 Bas… <NA>  Day 1  30 M…  0.522   0.5   0.5   0.5     0.5   
 5 01-701-1028 Day 1 Bas… <NA>  Day 1  1h P…  0.895   1     1     1       1     
 6 01-701-1028 Day 1 Bas… <NA>  Day 1  1.5h…  1.16    1.5   1.5   1.5     1.5   
 7 01-701-1028 Day 1 Bas… <NA>  Day 1  2h P…  1.35    2     2     2       2     
 8 01-701-1028 Day 1 Bas… <NA>  Day 1  4h P…  1.71    4     4     4       4     
 9 01-701-1028 Day 1 Bas… <NA>  Day 1  6h P…  1.80    6     6     6       6     
10 01-701-1028 Day 1 Bas… <NA>  Day 1  8h P…  1.82    8     8     8       8     
11 01-701-1028 Day 1 Bas… <NA>  Day 1  12h …  0.571  12    12    12      12     
12 01-701-1028 Day 1 Bas… <NA>  Day 1  16h …  0.178  16    16    16      16     
13 01-701-1028 Day 1 Bas… <NA>  Day 2  24h …  0.0173 24    24    24      24     
14 01-701-1028 Day 2 Bas… <NA>  Day 2  Dose  54      24     0    24       0     
15 01-701-1028 Day 2 Bas… COPY  Day 2  Pre-…  0.0173 24     0    24       0     
16 01-701-1028 Day 2 Bas… <NA>  Day 2  36h …  0.005  36    12    36      12     
17 01-701-1028 Day 2 Bas… <NA>  Day 3  48h …  0.005  48    24    48      24     
18 01-701-1028 Day 3 Bas… <NA>  Day 3  Dose  54      48     0    48       0     
19 01-701-1028 Day 3 Bas… COPY  Day 3  Pre-…  0.005  48     0    48       0     
# … with 2 more variables: BASE <dbl>, CHG <dbl>

Add ASEQ

# ---- Add ASEQ ----

adpc <- adpc %>%
  # Calculate ASEQ
  derive_var_obs_number(
    new_var = ASEQ,
    by_vars = exprs(STUDYID, USUBJID),
    order = exprs(ADTM, BASETYPE, EVID, AVISITN, ATPTN, DTYPE),
    check_type = "error"
  ) %>%
  # Remove temporary variables
  select(
    -DOMAIN, -PCSEQ, -starts_with("orig"), -starts_with("min"),
    -starts_with("max"), -starts_with("EX"), -ends_with("next"),
    -ends_with("prev"), -DRUG, -EVID, -AXRLT, -NXRLT
  ) %>%
  # Derive PARAM and PARAMN
  derive_vars_merged(dataset_add = select(param_lookup, -PCTESTCD), by_vars = exprs(PARAMCD))

ASEQ Ouput

# A tibble: 19 × 11
   USUBJID  BASET…¹ DTYPE AVISIT ATPT     AVAL NFRLT NRRLT   AFRLT   ARRLT  ASEQ
   <chr>    <chr>   <chr> <chr>  <chr>   <dbl> <dbl> <dbl>   <dbl>   <dbl> <int>
 1 01-701-… Day 1 … <NA>  Day 1  Pre-…  0       0     0    -0.5    -0.5        1
 2 01-701-… Day 1 … <NA>  Day 1  Dose  54       0     0     0       0          2
 3 01-701-… Day 1 … <NA>  Day 1  5 Mi…  0.0957  0.08  0.08  0.0833  0.0833     3
 4 01-701-… Day 1 … <NA>  Day 1  30 M…  0.522   0.5   0.5   0.5     0.5        4
 5 01-701-… Day 1 … <NA>  Day 1  1h P…  0.895   1     1     1       1          5
 6 01-701-… Day 1 … <NA>  Day 1  1.5h…  1.16    1.5   1.5   1.5     1.5        6
 7 01-701-… Day 1 … <NA>  Day 1  2h P…  1.35    2     2     2       2          7
 8 01-701-… Day 1 … <NA>  Day 1  4h P…  1.71    4     4     4       4          8
 9 01-701-… Day 1 … <NA>  Day 1  6h P…  1.80    6     6     6       6          9
10 01-701-… Day 1 … <NA>  Day 1  8h P…  1.82    8     8     8       8         10
11 01-701-… Day 1 … <NA>  Day 1  12h …  0.571  12    12    12      12         11
12 01-701-… Day 1 … <NA>  Day 1  16h …  0.178  16    16    16      16         12
13 01-701-… Day 1 … <NA>  Day 2  24h …  0.0173 24    24    24      24         13
14 01-701-… Day 2 … COPY  Day 2  Pre-…  0.0173 24     0    24       0         14
15 01-701-… Day 2 … <NA>  Day 2  Dose  54      24     0    24       0         15
16 01-701-… Day 2 … <NA>  Day 2  36h …  0.005  36    12    36      12         16
17 01-701-… Day 2 … <NA>  Day 3  48h …  0.005  48    24    48      24         17
18 01-701-… Day 3 … COPY  Day 3  Pre-…  0.005  48     0    48       0         18
19 01-701-… Day 3 … <NA>  Day 3  Dose  54      48     0    48       0         19
# … with abbreviated variable name ¹​BASETYPE

Add Additional Baseline Variables

  • Derive additional baseline values from VS
  • Baseline height HTBL and weight WTBL
  • Compute body mass index (BMI) with compute_bmi()

Additional Baseline Variables Code

# Derive additional baselines from VS
adpc <- adpc %>%
  derive_vars_merged(
    dataset_add = vs,
    filter_add = VSTESTCD == "HEIGHT",
    by_vars = exprs(STUDYID, USUBJID),
    new_vars = exprs(HTBL = VSSTRESN, HTBLU = VSSTRESU)
  ) %>%
  derive_vars_merged(
    dataset_add = vs,
    filter_add = VSTESTCD == "WEIGHT" & VSBLFL == "Y",
    by_vars = exprs(STUDYID, USUBJID),
    new_vars = exprs(WTBL = VSSTRESN, WTBLU = VSSTRESU)
  ) %>%
  mutate(
    BMIBL = compute_bmi(height = HTBL, weight = WTBL),
    BMIBLU = "kg/m^2"
  )

Additional Baseline Output

# A tibble: 19 × 10
   USUBJID      HTBL HTBLU  WTBL WTBLU BMIBL BMIBLU BASETYPE       ATPT     AVAL
   <chr>       <dbl> <chr> <dbl> <chr> <dbl> <chr>  <chr>          <chr>   <dbl>
 1 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline Pre-…  0     
 2 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline Dose  54     
 3 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 5 Mi…  0.0957
 4 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 30 M…  0.522 
 5 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 1h P…  0.895 
 6 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 1.5h…  1.16  
 7 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 2h P…  1.35  
 8 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 4h P…  1.71  
 9 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 6h P…  1.80  
10 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 8h P…  1.82  
11 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 12h …  0.571 
12 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 16h …  0.178 
13 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 24h …  0.0173
14 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 2 Baseline Pre-…  0.0173
15 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 2 Baseline Dose  54     
16 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 2 Baseline 36h …  0.005 
17 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 2 Baseline 48h …  0.005 
18 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 3 Baseline Pre-…  0.005 
19 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 3 Baseline Dose  54     

Add the ADSL variables

# Add all ADSL variables
adpc <- adpc %>%
  derive_vars_merged(
    dataset_add = select(adsl, !!!negate_vars(adsl_vars)),
    by_vars = exprs(STUDYID, USUBJID)
  )

Add Labels and Attributes

  • metacore: Establish a common foundation for the use of metadata within an R session.

  • metatools:

  • xportr: – Add metadata formats – Convert Attributes – Create Transport File

Example Scripts

ADaM Sample Code
ADPC ad_adpc.R

Questions and Answers

Thank You

  • {admiral} Team
  • Roche and Genentech Colleagues
  • Navitas Data Sciences Colleagues

Contact